package com.nercel.dsj.gksales.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import com.nercel.dsj.gksales.exception.ExceptionUtil;

import java.lang.reflect.Method;
import java.util.concurrent.Executor;

/**
 * @author sunlin
 * @date 2019-4-22
 */

@Configuration
@EnableAsync
@EnableScheduling
public class AsyncConfiguration implements AsyncConfigurer {

	private static final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class);

	@Override
	public Executor getAsyncExecutor() {
		ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
		threadPool.setCorePoolSize(2);//当前线程数
		threadPool.setMaxPoolSize(120);// 最大线程数
		threadPool.setQueueCapacity(1);//线程池所使用的缓冲队列
		threadPool.setWaitForTasksToCompleteOnShutdown(true);//等待任务在关机时完成--表明等待所有线程执行完
		threadPool.setAwaitTerminationSeconds(60 * 15);// 等待时间 （默认为0，此时立即停止），并没等待xx秒后强制停止
		threadPool.setThreadNamePrefix("MyAsync-");//  线程名称前缀
		threadPool.initialize(); // 初始化
		System.out.println("--------------------------》》》开启异常线程池");
		return threadPool;
	}

	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return new MyAsyncExceptionHandler();
	}

	/**
	 * 自定义异常处理类
	 * @author hry
	 *
	 */
	class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

		//手动处理捕获的异常
		@Override
		public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
			System.out.println("-------------》》》捕获线程异常信息");
			log.info("Exception message - " + throwable.getMessage());
			log.info("Method name - " + method.getName());
			for (Object param : obj) {
				log.info("Parameter value - " + param);
			}
			ExceptionUtil.printStackTrace2Log(throwable, log);
		}
	}


}